package com.demo.structure.array;

/**
 * 约瑟夫问题
 * N个人围成一圈，从第一个人开始报数，报到m的人出圈，
 * 剩下的人继续从1开始报数，报到m的人出圈；
 * 如此往复，直到所有人出圈。（模拟此过程，输出出圈的人的序号）
 *
 * @author: 蔡奇峰
 * @date: 2020/7/13 12:02
 **/
public class Josepfu {

    public static void main(String[] args) {
        RingLinkedList ringLinkedList = new RingLinkedList();

        ringLinkedList.add(2);

        ringLinkedList.list();

    }

}

/**
 * 环形链表
 */
class RingLinkedList {

    /**
     * 第一个节点
     */
    public People first = null;

    /**
     * 添加节点，构建环形链表
     *
     * @param count 添加个数
     */
    public void add(int count){
        if (count < 1){
            System.out.println("添加失败！至少添加一个节点！");
        }

        // 用于辅助遍历链表
        People temp = null;
        for (int i = 1; i <= count; i++) {
            People people = new People(i);
            if (i == 1){
                first = people;

                first.next = first;
                // 移动到第一个节点
                temp = first;
            }else {
                // 指向下一个
                temp.next = people;
                // 形成环形
                people.next = first;
                // 后移
                temp = people;
            }
        }
    }


    public void list(){
        if (isEmpty()){
            System.out.println("链表为空！");
            return;
        }

        People temp = first;
        while (true){
            System.out.println(temp.toString());
            // 移动到最后一个节点，则结束
            if (temp.next == first){
                break;
            }
            temp = temp.next;
        }
    }

    public boolean isEmpty(){
        return first == null;
    }
}

class People {

    private int id;

    /**
     * 指向下一个节点
     */
    public People next;

    public People(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                '}';
    }
}